import os
from PyPDF2 import PdfReader, PdfWriter
from pdf2image import convert_from_path
from pdf2docx import Converter
from pptx import Presentation
from pptx.util import Inches
import argparse

def split_pdf(input_path, output_dir, pages_per_file):
    """
    将PDF文件拆分成指定页数的多个PDF文件
    
    Args:
        input_path (str): 输入PDF文件路径
        output_dir (str): 输出目录
        pages_per_file (int): 每个输出文件包含的页数
    """
    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)
    
    # 读取PDF文件
    reader = PdfReader(input_path)
    total_pages = len(reader.pages)
    
    # 计算需要多少个文件
    num_files = (total_pages + pages_per_file - 1) // pages_per_file
    
    for i in range(num_files):
        writer = PdfWriter()
        start_page = i * pages_per_file
        end_page = min((i + 1) * pages_per_file, total_pages)
        
        # 添加页面到新的PDF文件
        for page_num in range(start_page, end_page):
            writer.add_page(reader.pages[page_num])
        
        # 保存新的PDF文件
        output_path = os.path.join(output_dir, f'split_{i+1}.pdf')
        with open(output_path, 'wb') as output_file:
            writer.write(output_file)
        print(f'已创建文件: {output_path}')

def pdf_to_images(input_path, output_dir, dpi=200):
    """
    将PDF文件的每一页转换为图片
    
    Args:
        input_path (str): 输入PDF文件路径
        output_dir (str): 输出目录
        dpi (int): 图片分辨率
    """
    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)
    
    # 将PDF转换为图片
    images = convert_from_path(input_path, dpi=dpi)
    
    # 保存每一页为图片
    for i, image in enumerate(images):
        output_path = os.path.join(output_dir, f'page_{i+1}.png')
        image.save(output_path, 'PNG')
        print(f'已创建图片: {output_path}')

def pdf_to_word(input_path, output_dir):
    """
    将PDF文件转换为Word文档
    
    Args:
        input_path (str): 输入PDF文件路径
        output_dir (str): 输出目录
    """
    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)
    
    # 生成输出文件路径
    output_path = os.path.join(output_dir, 'output.docx')
    
    # 转换PDF到Word
    cv = Converter(input_path)
    cv.convert(output_path)
    cv.close()
    
    print(f'已创建Word文档: {output_path}')

def pdf_to_ppt(input_path, output_dir):
    """
    将PDF文件转换为PPT演示文稿
    
    Args:
        input_path (str): 输入PDF文件路径
        output_dir (str): 输出目录
    """
    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)
    
    # 生成输出文件路径
    output_path = os.path.join(output_dir, 'output.pptx')
    
    # 创建PPT演示文稿
    prs = Presentation()
    
    # 将PDF转换为图片
    images = convert_from_path(input_path, dpi=200)
    
    # 为每一页创建幻灯片
    for i, image in enumerate(images):
        # 添加空白幻灯片
        slide = prs.slides.add_slide(prs.slide_layouts[6])  # 使用空白布局
        
        # 保存临时图片
        temp_img_path = os.path.join(output_dir, f'temp_{i}.png')
        image.save(temp_img_path, 'PNG')
        
        # 添加图片到幻灯片
        left = Inches(0)
        top = Inches(0)
        width = Inches(10)  # 设置图片宽度
        height = Inches(7.5)  # 设置图片高度
        
        slide.shapes.add_picture(temp_img_path, left, top, width, height)
        
        # 删除临时图片
        os.remove(temp_img_path)
    
    # 保存PPT文件
    prs.save(output_path)
    print(f'已创建PPT文件: {output_path}')

def main():
    parser = argparse.ArgumentParser(description='PDF处理工具')
    parser.add_argument('input_pdf', help='输入PDF文件路径')
    parser.add_argument('--split', action='store_true', help='是否拆分PDF')
    parser.add_argument('--pages', type=int, default=1, help='每个拆分文件包含的页数')
    parser.add_argument('--to-images', action='store_true', help='是否转换为图片')
    parser.add_argument('--to-word', action='store_true', help='是否转换为Word文档')
    parser.add_argument('--to-ppt', action='store_true', help='是否转换为PPT')
    parser.add_argument('--dpi', type=int, default=200, help='图片分辨率')
    parser.add_argument('--output-dir', default='output', help='输出目录')
    
    args = parser.parse_args()
    
    if args.split:
        split_output_dir = os.path.join(args.output_dir, 'split_pdfs')
        split_pdf(args.input_pdf, split_output_dir, args.pages)
    
    if args.to_images:
        images_output_dir = os.path.join(args.output_dir, 'images')
        pdf_to_images(args.input_pdf, images_output_dir, args.dpi)
        
    if args.to_word:
        word_output_dir = os.path.join(args.output_dir, 'word')
        pdf_to_word(args.input_pdf, word_output_dir)
        
    if args.to_ppt:
        ppt_output_dir = os.path.join(args.output_dir, 'ppt')
        pdf_to_ppt(args.input_pdf, ppt_output_dir)

if __name__ == '__main__':
    main() 